/*****************************************************************************
 * file  : systask.c
 * creat : apleilx
 * data  : 2017/11/05
 *******************************************************************************/
#define _SYSTASK_MODULE_
#include "os_obj.h"
#include "sys_task.h"
#include "pincfg.h"
#include "common.h"
#include "swap.h"
#include "bsp_api.h"
#include "fun_list.h"
#include "symbol_def.h"

/*****************************************************************************
 * @brief   fun.
 *****************************************************************************/
void sw_iic_opt(void);
void sys_flash_init(void);
void sys_tick_exe(void);
void sys_par_load(void);
FUN_LIST_REF(nsys);
FUN_LIST_REF(napp);

/*****************************************************************************
 * @brief   var.
 *****************************************************************************/

/*****************************************************************************
 * @brief   system task.
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void task_system(const void *argument)
{
	uint32_t tick;

	os_obj_create();

	sys_init();

	app_timer_task_add(sys_tick_exe);

	while (1)
	{
		sub2_add8(2, 200);

		fun_list_run_once(nsys);
		fun_list_run_once(napp);

		sys_st.u_tick = app_tick_get();

		// 虚拟RTC
		pulse_creat(&sys_st.pulse, sys_st.u_tick);
		if (sys_st.pulse.pulse_1s)
		{
			TimeRun(&sys_st.rtc_time);
			//dbg_print("system tick %d \n", sys_st.u_tick);
		}

		sys_app_run_once();

		tick = app_tick_get();

		sys_st.bsp_dly_verify = app_tick_get() - tick;

		NOP1();
		osDelay(ms_ticks(10));
		NOP1();
	}
}

/*****************************************************************************
 * @brief   led control.
 *****************************************************************************/
void sys_led_ctr(void)
{
	static word_tt st = {1};

	if (!sys_st.pulse.pulse_10ms)
		return;

	// 位移
	if (sys_st.pulse.pulse_100ms)
	{
		st.uval = bit16_roll_shift_left(st.uval, 4, 1);
	}

	// 输出
	o_led1.out(st.bits.b0);
	o_led2.out(st.bits.b1);
}
FUN_LIST_EXPORT(nsys, sys_led_ctr);

/*****************************************************************************
 * @brief   flash opt.
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void sys_flash_init(void)
{
}

/*****************************************************************************
 * @brief   iic opt.
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void sw_iic_opt(void)
{
}

/*****************************************************************************
 *
 * @brief   task switch hook.
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void task_sw_hook(char pos)
{
}

/*****************************************************************************
 *
 * @brief   sys_par_load
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void sys_par_load(void)
{
}

/*****************************************************************************
 *
 * @brief   sys_tick_exe
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void sys_tick_exe(void)
{
}

/*****************************************************************************
 * @brief   system info.
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void system_info(void)
{
	RCC_ClocksTypeDef clocks;

	RCC_GetClocksFreq(&clocks);

	sys_st.clks.hclk = clocks.HCLK_Frequency;
	sys_st.clks.apb1 = clocks.PCLK1_Frequency;
	sys_st.clks.apb2 = clocks.PCLK2_Frequency;
	sys_st.clks.adc = clocks.ADCCLK_Frequency;

	dbg_puts("===========================================================\n");
	dbg_print("HCLK = %d MHZ, PCLK1 = %d MHZ, PCLK2 = %d MHZ\n",
			  clocks.HCLK_Frequency / 1000000,
			  clocks.PCLK1_Frequency / 1000000,
			  clocks.ADCCLK_Frequency / 1000000);
	dbg_puts("===========================================================\n");
}
obj_init_order5(system_info);

fun_list_hook(nsys)
{
}
